package com.example.scheduled.task;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class ScheduledTasks {

    private final static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 描述：表示任务的执行频率，以毫秒为单位。任务会在上一个任务开始后的指定时间后再次执行。
     *
     * 用法：@Scheduled(fixedRate = 5000) 表示每5秒执行一次。
     */
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() {
        System.out.println("fixedRateTask："+dateFormat.format(new Date()));
    }

    /**
     * 描述：表示任务的执行延迟。任务会在上一个任务结束后，经过指定的延迟时间再开始新的执行。
     *
     * 用法：@Scheduled(fixedDelay = 10000) 表示在上一个任务完成后，等待10秒再执行下一个任务。
     */
    @Scheduled(fixedDelay = 10000)
    public void fixedDelayTask() {
        System.out.println("fixedDelayTask："+dateFormat.format(new Date()));
    }

    /**
     * 描述：用于指定任务第一次执行前的延迟时间。用于与fixedRate或fixedDelay一起使用。
     *
     * 用法：@Scheduled(initialDelay = 5000, fixedRate = 10000) 表示在启动后5秒后第一次执行，然后每10秒执行一次。
     */
    @Scheduled(initialDelay = 5000, fixedRate = 10000)
    public void initialDelayTask() {
        System.out.println("initialDelayTask："+dateFormat.format(new Date()));
    }

    /**
     * 描述：使用Cron表达式来定义任务的执行时间，可以进行非常精细的控制。Cron表达式分为6个字段（有些实现会用7个字段，在最后加上年份），分别表示秒、分钟、小时、日、月、星期。
     *
     * 用法：@Scheduled(cron = "0 * * * * ?") 表示每分钟的第0秒执行任务。
     */
    @Scheduled(cron = "0 * * * * ?")
    public void cronTask() {
        System.out.println("cronTask："+dateFormat.format(new Date()));
    }
}